home *** CD-ROM | disk | FTP | other *** search
- #include "ComponentData.h"
- #include <OSUtils.h>
- #include <Script.h>
- #include <Language.h>
- #include "MyOverrideRoutine2.h"
- #include "MyOpenComponent.h"
-
- pascal ComponentResult MyOverrideRoutine2( PrivateGlobals **storage,TimeValue atMediaTime, long flagsIn, long *flagsOut, const TimeRecord *movieTime )
- {
- /*
- Possible errors:
- GetMediaSample or SpeakText fail with -108. Not fatal, might not speak. Oh well.
- There is no text in the text sample, so we pass back -1. Who cares.
- */
-
- OSErr err = -1;
- ComponentResult result;
- long textSampleSize = 0;
-
- err = GetMediaSample( (*storage)->coolMedia, // Get this from MyMediaInitialize
- (*storage)->textH, // Pass this in to SpeakText
- 0, // The textBuffer can grow as much as it wants. Not so great an idea
- &textSampleSize, // Get this for SpeakText
- atMediaTime, // Starting time of media to be retrieved,
- //media timescale
- nil, nil, nil, nil, 0, nil, nil );
-
- if (!err)
- {
- short textSize, language;
- Handle textSampleHandle = (*storage)->textH;
-
- /* First two bytes of the text sample contains the size of the text */
- textSize = *(short*)(*textSampleHandle);
-
- if (textSize > 0)
- {
- Ptr textPtr;
- Handle textHandle;
- long textSampleHeader;
- char *textSamplePtr;
-
- /* Sample size is returned by GetMediaSample. */
- textSampleHeader = textSampleSize - textSize;
-
- /* The header is usually 2 bytes, which specifies the size of the
- text. Sometimes, though, it can have extra information such as
- style information. We need to jump past the header to get to
- the text. */
- textSamplePtr = (char *) *textSampleHandle;
- textPtr = (Ptr)( textSamplePtr + textSampleHeader );
-
- language = GetMediaLanguage((*storage)->coolMedia);
- switch(language)
- {
- case langEnglish:
- err = SpeakEnglish((*storage)->coolSpeechChannel,textPtr,textSize);
- break;
- case langJapanese: // langJapanese = 11 'Language.h'
- err = SpeakJapanese(storage,textPtr,textSize);
- break;
- default:
- err = SpeakText ( (*storage)->coolSpeechChannel,
- textPtr,
- textSize);
- }
- }
- }
-
- return (ComponentResult) err;
- }
-
- OSErr SpeakEnglish(SpeechChannel coolSpeechChannel, Ptr textPtr, long textSize)
- {
- OSErr err;
-
- err = SpeakText ( coolSpeechChannel,
- textPtr,
- textSize);
- return err;
- }
-
-
- OSErr SpeakJapanese(PrivateGlobals **storage, Ptr textPtr, long textSize)
- {
- Handle translatedTextH = (*storage)->translatedTextH;
- OSErr err;
- Handle textHandle;
-
- textHandle = NewHandle(textSize);
- HLock(textHandle);
- BlockMove(textPtr,*textHandle,textSize);
- SetHandleSize(translatedTextH,textSize);
- err = Transliterate( textHandle,
- translatedTextH,
- smTransAscii1,
- smMaskKana1 + smMaskKana2 + smMaskGana2 );
- HUnlock(textHandle);
- DisposeHandle(textHandle);
- if (err == noErr) // we must pass the HIRAGANA or KATAKANA text, not Kanji.
- {
- short index;
-
- HLock(translatedTextH);
- for(index=0;index<GetHandleSize(translatedTextH);index++)
- if ((*(*translatedTextH+index) < 0x20) || (*(*translatedTextH+index) > 0x80))
- *(*translatedTextH+index)= 0;
- err = SpeakText ((*storage)->coolSpeechChannel, (Ptr) *translatedTextH, GetHandleSize(translatedTextH));
- HUnlock(translatedTextH);
- }
- return err;
- }
-
-